package org.huang.spock.base

import spock.lang.Specification


class SpyDemoTest extends Specification {

    class SpyDemo {

        //第一方法调用另一个方法，希望mock另一个方法
        String handleSpy(String code) {
            String data = doSomething(code);
            return "handleSpy:" + data + "_" + code;
        }

        protected String doSomething(String code) {
            return "doSomething:" + code;
        }
    }

    /**
     * Spy()间谍或叫刺探方法，他会包装一个真实的对象，默认情况下将调用真实的方法，在Spock中 Spy 也具有Mock的能力。
     * 举例：被测试的方法中会调用当前类的另外一个方法，但另外一个方法里面的逻辑很复杂或调用了外部依赖，那么我们可以通过Spy可以让第一个方法内部不调用另外一个方法，这样就只测试第一个方法。
     */
    def "test the method of handleSpy"() {
        given:
        def spy = Spy(SpyDemo)
        spy.doSomething(_) >> data
        expect:
        result == spy.handleSpy(code)
        where:
        data | code    || result
        "1"  | "hello" || "handleSpy:1_hello"
        "2"  | "he"    || "handleSpy:2_he"
        "1"  | ""      || "handleSpy:1_"
        "1"  | "xx"    || "handleSpy:1_xx"

    }

}